﻿// Osenbei Aizu - 0525.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>



using namespace std;
//https://vjudge.csgrandeur.cn/problem/Aizu-0525
/*
问题：
IOI制菓公司沿用传统的方法来烘焙米饼（Senbei），从创业以来就一直如此。这种传统方法是在炭火上烘烤一定时间的正面，当正面烤好后翻转过来，在炭火上烘烤背面一定时间。
为了保持这一传统，他们使用机器来制作米饼。这台机器将米饼按照矩形的形状排列，有 R (1 ≤ R ≤ 10) 行，C (1 ≤ C ≤ 10000) 列。
通常情况下，机器是自动运行的，当正面烤好时同时翻转所有的米饼以烤熟背面。

一天，烘焙米饼时，在翻转之前发生了地震，导致一些米饼已经翻转过来了。幸运的是，炭火的状态仍然适宜，
但如果继续烤正面，将超过创业以来规定的烘焙时间，导致米饼的正面过熟无法作为商品出货。
因此，他们迅速将机器切换到手动操作，并打算只翻转尚未翻转的米饼。该机器可以同时翻转几行横向或几列纵向的米饼，但遗憾的是无法单独翻转一片米饼。

如果翻转需要太长时间，那些没有被地震翻转过的米饼的正面会过熟，无法作为商品出货。为了尽可能多地制作能够出货的米饼，即所谓的「可出货米饼」，
他们决定同时翻转几行横向和几列纵向，以确保两面都能烘焙好而不过度烘焙。我们将考虑不翻转任何行或列的情况。请编写一个程序来输出能够出货的米饼的最大数量。

在地震之后，假设米饼处于以下状态：

（这里应该有一个图示，描述米饼的状态，但我无法在文本中插入图形，请提供其他问题细节或说明。）

根据提供的输入和输出示例，可以进行如下翻译：

问题：
在地震之后，米饼处于以下状态（图示略）。黑色的圆表示正面已经烤好，白色的圆表示背面已经烤好。

翻转第1行后，状态如下（图示略）。

进一步地，翻转第1列和第5列后，状态如下（图示略）。在这种状态下，能够出货的米饼数量为9。

提示：
注意到R的上限10相对于C的上限10000较小。

输入：
输入包含多个数据集。每个数据集的格式如下：

第一行是两个整数R和C（1 ≤ R ≤ 10, 1 ≤ C ≤ 10,000），以空格分隔。接下来的R行表示地震发生后的米饼状态。
第（i+1）行（1 ≤ i ≤ R）有C个整数ai,1, ai,2, ……, ai,C，用空格分隔，其中ai,j表示第i行第j列的米饼状态。
如果ai,j为1，则表示正面已经烤好；如果ai,j为0，则表示背面已经烤好。

当C和R都为0时，表示输入结束。数据集的数量不超过5个。

输出：
对于每个数据集，将能够出货的米饼的最大数量输出在一行中。

入力例
2 5
0 1 0 1 0
1 0 0 0 1
3 6
1 0 0 0 1 0
1 1 1 0 1 0
1 0 1 1 0 1
3 6
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
3 6
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
3 6
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 0 0
3 6
1 1 1 1 1 1
1 1 1 0 1 1
1 1 1 1 1 1
0 0
出力例
9
15


*/


int r, c;
int gra[15][10010];
int ans = -1;

void flip(int row) {
	for (int j = 0; j < c; j++) {	gra[row][j] ^= 1;}
}

void reflip(int row) {
	flip(row);
}

void Check() {
	int sum = 0;
	for (int i = 0; i < c; i++) {
		int a = 0; int b = 0;
		for (int j = 0; j < r; j++) {
			if (gra[j][i] == 1) {a++;}
			else {b++;}
		}
		sum += max(a, b);
	}

	ans = max(sum, ans);
}

void dfs(int curr) {
	if (curr >= r) {
		//检验当前的
		Check();
		return;
	}

	//当前   选择或者不选择
	flip(curr);
	dfs(curr + 1);
	reflip(curr);

	dfs(curr+1);

	return;
}


void solve() {
	ans = -1;
	dfs(0);

	cout << ans << endl;
	return ;
}


int main()
{
	while (cin >> r >> c) {
		if (r == 0 && c == 0) break;
		for (int i = 0; i < r; i++) {
			for (int j = 0; j < c; j++) {
				cin >> gra[i][j];
			}
		}

		solve();
	}

	return 0;
}
 